package com.bawei.club.test.recyclerview

import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
import com.bawei.club.R
import com.bawei.lib_common.utils.ToastUtils
import com.bawei.lib_image.GlideApp
import com.scwang.smart.refresh.layout.SmartRefreshLayout

/**
 * 一.四级缓存-》回收复用ViewHolder-》目的减少viewHolder创建和绑定数据次数（onCreateViewHolder onBindViewHolder）
 *
 * 1.屏幕内缓存： 屏幕内缓存指在屏幕中显示的ViewHolder，在快速滑动时屏幕内viewholder的复用
 * 2.屏幕外缓存： 当列表滑动出了屏幕时，缓存的ViewHolder默认是2个：mCacheViews（复用的时候不需要onCreate和onBind）
 * 3.RecycledViewPool类是用来缓存ViewHolder，一种item类型存储5个viewHolder（复用的时候不需要onCreate，需要onBind）
 * 多个页面的recyclerview可以共享viewholder，可以通过setRecycledViewPool(RecycledViewPool)设置同一个RecycledViewPool，他们就可以共享ViewHolder
 * 4.开发者可自定义缓存，是虚拟类ViewCacheExtension的一个实例，开发者可实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存
 *
 * 二.局部刷新，局部增量刷新
 *
 *
 * 三.布局优化
 * 1.减少item层级嵌套
 * 2.item高度固定
 *
 * 四.onCreateViewHolder和onBindViewHolder不要做复杂操作，不要创建对象
 * （1）不要在onBindViewHolder实现点击事件，放在viewHolder构造中实现
 *
 *
 * 五.刷新，不要
 * （1）局部刷新（刷新整个item）：notifyItemInserted、notifyItemRemoved、notifyItemChanged、notifyItemMoved
 * （2）局部增量刷新payloads(只刷新一个item某个控件)：adapter.notifyItemRangeChanged(position,“payload”) + onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>)
 *  (3)使用DiffUtils完成局部刷新和局部增量刷新
 *      a。自定义DiffUtils.CallBack：重写对比id、对比内容、payload局部增量刷新
 *      b.适配器使用CallBack进行计算
 *         val calculateDiff = DiffUtil.calculateDiff(MyDiffCallBack(data.toList(), newData))//旧数据和新数据,注意不要传引用，使用toList
 *         data.clear()
 *         data.addAll(newData)
 *         calculateDiff.dispatchUpdatesTo(this)
 *      c。设置新的数据源
 *          a。对比id：判断是否有新增id和删除id
 *          b。id相同，对比内容
 *              内容相同不刷新
 *              内容不同--》局部增量刷新payloads
 *  总结：
 *  （1）和（2）适用于item，点赞、收藏、删除一个条目、新增一个条目
 *  （3）适用于刷新整个列表，比如首页数据刷新，对比差距实现局部刷新
 *
 *  六.图片加载：滑动暂停加载图片、停止滑动再去加载
 *
 *  七.大量数据如何处理？无感刷新
 */
class RecyclerViewActivity : AppCompatActivity() {
    private lateinit var rv:RecyclerView
    private lateinit var adapter: MyAdapter
    private lateinit var smartRefreshLayout: SmartRefreshLayout
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_recycler_view)
        smartRefreshLayout = findViewById(R.id.smart)
        rv = findViewById(R.id.rv)
        adapter = MyAdapter(
            onLikeClick = { position ->
                adapter.like(position)
            },
            preloadItemCount = 3,
            //不需要触底，倒数第几个宇加载数据
            onPreload = {
                val list = mutableListOf<MyModel>()
                for (i in 12..20){
                    list.add(MyModel(i,"name$i","https://img.alicdn.com/imgextra/i1/O1CN01XZYxqQ1QxZYxqQ1QxZYxqQ1QxZYxqQ.jpg",false))
                }
                adapter.addData(list)
                ToastUtils.showLong(this,"宇加载下一页数据")
            }
        )
        rv.adapter = adapter
        rv.layoutManager = LinearLayoutManager(this)
        val list = mutableListOf<MyModel>()
        for (i in 0..10){
            list.add(MyModel(i,"name$i","https://img.alicdn.com/imgextra/i1/O1CN01XZYxqQ1QxZYxqQ1QxZYxqQ1QxZYxqQ.jpg",false))
        }
        adapter.setData(list)
        //优化一：调整缓存大小
        rv.setItemViewCacheSize(10)
        rv.recycledViewPool.setMaxRecycledViews(0,10)
        //优化二：多个recyclerview共用一个pool(item布局样式相同)
        val pool = RecycledViewPool()
        pool.setMaxRecycledViews(0,10)
        rv.setRecycledViewPool(pool)
        //优化三:item高度固定，减少item的layout次数，不会重新测量
        rv.setHasFixedSize(true)

        //优化图片加载
        rv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                when (newState) {
                    //空闲状态
                    RecyclerView.SCROLL_STATE_IDLE -> {
                        GlideApp.with(this@RecyclerViewActivity).resumeRequests()
                    }
                    //拖拽
                    RecyclerView.SCROLL_STATE_DRAGGING -> {
                        GlideApp.with(this@RecyclerViewActivity).pauseRequests()
                    }
                    //惯性滚动
                    RecyclerView.SCROLL_STATE_SETTLING -> {
                        GlideApp.with(this@RecyclerViewActivity).pauseRequests()
                    }
                }
            }
        })

        //上拉下啦
        smartRefreshLayout.setOnRefreshListener {

        }
        //必须触底才会加载下一页数据
        smartRefreshLayout.setOnLoadMoreListener {
            ToastUtils.showLong(this,"触底加载下一页数据")
        }


    }

    fun all(view: View) {
        //旧： 0 ...    10
        //新： 0 1(改变) 3 4 5...11

        val list = mutableListOf<MyModel>()
        for (i in 0..11){
            list.add(MyModel(i,"name$i","https://img.alicdn.com/imgextra/i1/O1CN01XZYxqQ1QxZYxqQ1QxZYxqQ1QxZYxqQ.jpg",false))
        }
        list.removeAt(2)
        list[1].name = "hahahah"
        adapter.setData(list)
    }
}